package com.liu.shop.common.ThreadPool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 商品模块中的线程池
 * 使用饿汉模式创建单例的，每次拿取线程时为了保证是同一个线程池，不会创建多个导致资源的浪费
 */
public class ShopExecutor {

    // 1.创建一个线程池
    private static ThreadPoolExecutor executors = null;

    // 静态块，只会创建一次，来实现单例
    static {
        executors = new ThreadPoolExecutor(
          5,  // 线程核心数，线程池创建的时候就会有5个线程
          15, // 最大线程数，这个线程中线程的数量最大为15个，再有线程就到队列中等待
          3, // 空闲线程回收的时间，每间隔3秒就扫描一次是否有空闲的线程并讲其回收
          TimeUnit.SECONDS, // 设置时间类型
          new ArrayBlockingQueue<>(20), // 当线程池中线程满了，剩下的线程就再队列中
          Executors.defaultThreadFactory(), // 创建线程的默认工厂
          new ThreadPoolExecutor.AbortPolicy()// 拒绝策略，队列的长度满了以后执行的拒绝策略
        );
    }

    // 供外部调用线程池拿取线程
    public static ThreadPoolExecutor getExecutor() {
        return executors;
    }

}
